home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Information / CSMP Digest / volume 3 / csmp-digest-v3-111 < prev    next >
Text File  |  1995-12-31  |  54KB  |  1,345 lines

  1. C.S.M.P. Digest             Tue, 19 Sep 95       Volume 3 : Issue 111
  2.  
  3. Today's Topics:
  4.  
  5.         Difference between BlockMove() and BlockMoveData()?
  6.         Easiest way to get vRefNum of startup volume?
  7.         Pointers to functions on the PowerPC?
  8.         Preferences Database project discussion
  9.         QuickTime volumes
  10.         Random Numbers
  11.         [Q] Gestalt to determine number of serial ports?
  12.  
  13.  
  14.  
  15. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  16. (pottier@clipper.ens.fr).
  17.  
  18. The digest is a collection of article threads from the internet newsgroups
  19. comp.sys.mac.programmer.help, csmp.tools and csmp.misc. It is designed for
  20. people who read news semi-regularly and want an archive of the discussions.
  21. If you don't know what a newsgroup is, you probably don't have access to
  22. it. Ask your systems administrator(s) for details. If you don't have access
  23. to news, you may still be able to post messages to the group by using a
  24. mail server like anon.penet.fi (mail help@anon.penet.fi for more
  25. information).
  26.  
  27. Each issue of the digest contains one or more sets of articles (called
  28. threads), with each set corresponding to a 'discussion' of a particular
  29. subject.  The articles are not edited; all articles included in this digest
  30. are in their original posted form (as received by our news server at
  31. nef.ens.fr).  Article threads are not added to the digest until the last
  32. article added to the thread is at least two weeks old (this is to ensure that
  33. the thread is dead before adding it to the digest).  Article threads that
  34. consist of only one message are generally not included in the digest.
  35.  
  36. The digest is officially distributed by two means, by email and ftp.
  37.  
  38. If you want to receive the digest by mail, send email to listserv@ens.fr
  39. with no subject and one of the following commands as body:
  40.     help                                Sends you a summary of commands
  41.     subscribe csmp-digest Your Name     Adds you to the mailing list
  42.     signoff csmp-digest                 Removes you from the list
  43. Once you have subscribed, you will automatically receive each new
  44. issue as it is created.
  45.  
  46. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  47. Questions related to the ftp site should be directed to
  48. scott.silver@dartmouth.edu.
  49.  
  50. -------------------------------------------------------
  51.  
  52. >From jeffp@amanda.dorsai.org (Jeffrey Posnick)
  53. Subject: Difference between BlockMove() and BlockMoveData()?
  54. Date: Fri, 1 Sep 1995 19:42:03 GMT
  55. Organization: The Dorsai Embassy
  56.  
  57. The title says it all: is there any difference between BlockMove() and
  58. BlockMoveData()? If so, when should I use one and not the other?Thanks for
  59. any info you could offer, MPTA didn't even seem to know BlockMoveData()
  60. existed.
  61.  
  62. Jeffrey Posnick | <mailto:jeffp@amanda.dorsai.org> | <mailto:ElLeon@aol.com>
  63. The opinions expressed above do not necessarily reflect those of my employer (which is a little strange since I'm self employed).
  64.  
  65. +++++++++++++++++++++++++++
  66.  
  67. >From andrewwelc@aol.com (AndrewWelc)
  68. Date: 1 Sep 1995 18:40:53 -0400
  69. Organization: America Online, Inc. (1-800-827-6364)
  70.  
  71. > The title says it all: is there any difference between BlockMove() and
  72. > BlockMoveData()? If so, when should I use one and not the other?Thanks
  73. > for any info you could offer, MPTA didn't even seem to know
  74. > BlockMoveData() existed.
  75.  
  76. Yes -- BlockMove flushes the instruction caches (on most block moves),
  77. while BlockMoveData doesn't.  If you're just moving data around,
  78. BlockMoveData will be a bit faster.
  79.  
  80. Regards,
  81.  
  82. Andrew Welch
  83. Thaumaturgist
  84. Ambrosia Software, Inc.
  85.  
  86. ..........
  87.  
  88. For the latest versions of our software, technical support, and Ambrosia
  89. news, stop by and visit the Ambrosia Software, Inc. support forums:
  90.  
  91. America Online ---> Keyword: Ambrosia
  92.     CompuServe ---> GO word: Ambrosia
  93.         eWorld --> Shortcut: Ambrosia
  94.  
  95. +++++++++++++++++++++++++++
  96.  
  97. >From Richard Wesley <hawkfish@punchdeck.com>
  98. Date: 2 Sep 1995 14:18:25 GMT
  99. Organization: Punch Deck Consulting
  100.  
  101. jeffp@amanda.dorsai.org (Jeffrey Posnick) wrote:
  102. >The title says it all: is there any difference between BlockMove() and
  103. >BlockMoveData()? If so, when should I use one and not the other?Thanks for
  104. >any info you could offer, MPTA didn't even seem to know BlockMoveData()
  105. >existed.
  106. >
  107. >Jeffrey Posnick | <mailto:jeffp@amanda.dorsai.org> | <mailto:ElLeon@aol.com>
  108. >The opinions expressed above do not necessarily reflect those of my employer (which is a little strange since I'm self employed).
  109.  
  110. ::BlockMove flushes the instruction cache, ::BlockMoveData does not.  You should
  111. use ::BlockMoveData for data and ::BlockMove for anything else.
  112.  
  113. - rmgw
  114.  
  115. http://www.punchdeck.com/hawkfish/PunchDeck.html
  116.  
  117. - --------------------------------------------------------------------------
  118. Richard Wesley  hawkfish@punchdeck.com | "'Hand it round first, and cut it
  119. Punch Deck Consulting pnchdeck@aol.com |  afterwards.'" - Lewis Carroll,
  120.      Macintosh Software Development    |    "Through the Looking Glass"
  121. - --------------------------------------------------------------------------
  122.  
  123.  
  124.  
  125. +++++++++++++++++++++++++++
  126.  
  127. >From vision@cc.swarthmore.edu (Frank Durgin, et al.)
  128. Date: Sat, 02 Sep 1995 16:58:44 -0400
  129. Organization: Swarthmore Visual Perception Lab
  130.  
  131. In article <jeffp-0109951542030001@jeffp.ppp.dorsai.org>,
  132. jeffp@amanda.dorsai.org (Jeffrey Posnick) wrote:
  133.  
  134. > The title says it all: is there any difference between BlockMove() and
  135. > BlockMoveData()? If so, when should I use one and not the other?Thanks for
  136. > any info you could offer, MPTA didn't even seem to know BlockMoveData()
  137. > existed.
  138.  
  139. BlockMoveData() doesn't flush the instruction cache (if any), so it's
  140. *slightly* faster on the '040. On 604 machines with the DRE,
  141. BlockMoveData() can be quite a lot faster since (at least in loops)
  142. flushing the caches can mean the difference between recompiling 68k
  143. instructions as PPC once and then running N-1 chunks of PPC code and
  144. recompiling 68k instructions as PPC N times. On machines with no
  145. instruction cache, the two calls are the same.
  146.  
  147. In other words, if you are copying data rather than instructions, use
  148. BlockMoveData(). Can't hurt; might help.
  149.  
  150.  
  151. Ta,
  152.         -Stephen
  153.  
  154. +++++++++++++++++++++++++++
  155.  
  156. >From donald@epix.net (Donald Way)
  157. Date: Sun, 03 Sep 1995 18:39:17 -0500
  158. Organization: epix.net
  159.  
  160. In article <vision-0209951658440001@wallach.swarthmore.edu>,
  161. ssample1@swarthmore.edu wrote:
  162.  
  163. > In article <jeffp-0109951542030001@jeffp.ppp.dorsai.org>,
  164. > jeffp@amanda.dorsai.org (Jeffrey Posnick) wrote:
  165. > > The title says it all: is there any difference between BlockMove() and
  166. > > BlockMoveData()? If so, when should I use one and not the other?Thanks for
  167. > > any info you could offer, MPTA didn't even seem to know BlockMoveData()
  168. > > existed.
  169. > BlockMoveData() doesn't flush the instruction cache (if any), so it's
  170. > *slightly* faster on the '040. On 604 machines with the DRE,
  171. > BlockMoveData() can be quite a lot faster since (at least in loops)
  172. > flushing the caches can mean the difference between recompiling 68k
  173. > instructions as PPC once and then running N-1 chunks of PPC code and
  174. > recompiling 68k instructions as PPC N times. On machines with no
  175. > instruction cache, the two calls are the same.
  176. > In other words, if you are copying data rather than instructions, use
  177. > BlockMoveData(). Can't hurt; might help.
  178.  
  179.  
  180. Jeez, I guess I gotta start reading the headers more often.  When did they
  181. sneak this one in?  No reference to it ANYWHERE as far as I can tell. 
  182. It'd be great if everytime Apple did something like this a little dogcow
  183. would start flashing in my task menu.
  184.  
  185. BTW, do we need to test for the trap, or is there some minimum system
  186. configuration upon which we can simply *assume* that BlockMoveData is
  187. present?
  188.  
  189. -- 
  190. Donald Way
  191. donald@epix.net
  192.  
  193. +++++++++++++++++++++++++++
  194.  
  195. >From steve@mindvision.com (Steve Kiene)
  196. Date: Mon, 04 Sep 1995 01:30:05 -0700
  197. Organization: MindVision Software
  198.  
  199. In article <donald-0309951839170001@qrvlppp40.epix.net>, donald@epix.net
  200. (Donald Way) wrote:
  201.  
  202. > In article <vision-0209951658440001@wallach.swarthmore.edu>,
  203. > ssample1@swarthmore.edu wrote:
  204. > > In article <jeffp-0109951542030001@jeffp.ppp.dorsai.org>,
  205. > > jeffp@amanda.dorsai.org (Jeffrey Posnick) wrote:
  206. > > 
  207. > > > The title says it all: is there any difference between BlockMove() and
  208. > > > BlockMoveData()? If so, when should I use one and not the other?Thanks for
  209. > > > any info you could offer, MPTA didn't even seem to know BlockMoveData()
  210. > > > existed.
  211. > > 
  212. > > BlockMoveData() doesn't flush the instruction cache (if any), so it's
  213. > > *slightly* faster on the '040. On 604 machines with the DRE,
  214. > > BlockMoveData() can be quite a lot faster since (at least in loops)
  215. > > flushing the caches can mean the difference between recompiling 68k
  216. > > instructions as PPC once and then running N-1 chunks of PPC code and
  217. > > recompiling 68k instructions as PPC N times. On machines with no
  218. > > instruction cache, the two calls are the same.
  219. > > 
  220. > > In other words, if you are copying data rather than instructions, use
  221. > > BlockMoveData(). Can't hurt; might help.
  222. > Jeez, I guess I gotta start reading the headers more often.  When did they
  223. > sneak this one in?  No reference to it ANYWHERE as far as I can tell. 
  224. > It'd be great if everytime Apple did something like this a little dogcow
  225. > would start flashing in my task menu.
  226. > BTW, do we need to test for the trap, or is there some minimum system
  227. > configuration upon which we can simply *assume* that BlockMoveData is
  228. > present?
  229.  
  230.  
  231. You don't need to test for the presence of the trap. It's simply the
  232. _BlockMove trap with the immediate bit set in the trap word. If a
  233. particular ROM doesn't support it, the bit is just ignored.
  234.  
  235. Steve Kiene
  236. MindVision Software
  237.  
  238. ---------------------------
  239.  
  240. >From eddyg@vcd.hp.com (Eddy J. Gurney)
  241. Subject: Easiest way to get vRefNum of startup volume?
  242. Date: 22 Aug 1995 22:01:24 GMT
  243. Organization: Hewlett-Packard
  244.  
  245. I want to call PBHGetVInfo and the two easiest ways appear to be
  246. specifying the vRefNum or the volume index.  Can I make any assumptions
  247. about the volume index for the startup volume (i.e., is volume index
  248. 0 always the startup volume?) or can I always assume that the vRefNum
  249. will be -1 for the startup volume?
  250.  
  251. If not, what is the simplest correct way to determine the vRefNum or
  252. volume index of the startup volume?
  253.  
  254. Thanks,
  255. Eddy
  256.  
  257. +++++++++++++++++++++++++++
  258.  
  259. >From tulip@tiac.net (Ed Anson)
  260. Date: Tue, 22 Aug 1995 23:52:12 -0400
  261. Organization: Tulip Software
  262.  
  263. In article <41dk3k$efh@news.vcd.hp.com>, eddyg@vcd.hp.com (Eddy J. Gurney)
  264. wrote:
  265.  
  266. > I want to call PBHGetVInfo and the two easiest ways appear to be
  267. > specifying the vRefNum or the volume index.  Can I make any assumptions
  268. > about the volume index for the startup volume (i.e., is volume index
  269. > 0 always the startup volume?) or can I always assume that the vRefNum
  270. > will be -1 for the startup volume?
  271. > If not, what is the simplest correct way to determine the vRefNum or
  272. > volume index of the startup volume?
  273.  
  274. The System folder is always on the startup volume.
  275.  
  276. Use the Folder Manager to locate the System folder, and the resulting file
  277. spec will reveal the startup volume.
  278.  
  279. - --------------------
  280. Ed Anson            MediaTree: multimedia outline editor & catalog
  281. Tulip Software
  282. Andover, MA 01810   For details, check out my WWW page:
  283. U.S.A.              <http://www.tiac.net/users/tulip/home.html>
  284.  
  285. +++++++++++++++++++++++++++
  286.  
  287. >From andrewwelc@aol.com (AndrewWelc)
  288. Date: 23 Aug 1995 00:00:04 -0400
  289. Organization: America Online, Inc. (1-800-827-6364)
  290.  
  291. > or can I always assume that the vRefNum will be -1 for the startup
  292. > volume?
  293.  
  294. Yep, according to Apple, it is always -1.
  295.  
  296. Regards,
  297.  
  298. Andrew Welch
  299. Thaumaturgist
  300. Ambrosia Software, Inc.
  301.  
  302. ..........
  303.  
  304. For the latest versions of our software, technical support, and Ambrosia
  305. news, stop by and visit the Ambrosia Software, Inc. support forums:
  306.  
  307. America Online ---> Keyword: Ambrosia
  308.     CompuServe ---> GO word: Ambrosia
  309.         eWorld --> Shortcut: Ambrosia
  310.  
  311. +++++++++++++++++++++++++++
  312.  
  313. >From jumplong@aol.com (Jump Long)
  314. Date: 3 Sep 1995 00:12:51 -0400
  315. Organization: America Online, Inc. (1-800-827-6364)
  316.  
  317. andrewwelc@aol.com (AndrewWelc) replied:
  318.  
  319. >> or can I always assume that the vRefNum will be -1 for the startup
  320. >> volume?
  321. >
  322. >Yep, according to Apple, it is always -1.
  323.  
  324. With the current File Manager, it is always -1. That because the boot
  325. volume is mounted first and volume reference numbers are allocated
  326. starting with -1. However, that's not something that is guaranteed (and in
  327. fact, it almost changed once).
  328.  
  329. Use FindFolder to find the System Folder and then use the vRefNum
  330. returned. That will work no matter what changes in the future.
  331.  
  332. - Jim Luther
  333.  
  334.  
  335. ---------------------------
  336.  
  337. >From jrs@az.com (Jonathan R. Seagrave)
  338. Subject: Pointers to functions on the PowerPC?
  339. Date: 3 Sep 1995 19:57:23 GMT
  340. Organization: Northwest Nexus Inc.
  341.  
  342. Hi, I've been having some trouble porting 68k code to PowerPC code.  I
  343. thought maybe I could get a pointer or two.  First, (I'll focus on a
  344. specific problem -- I doubt I'd get much response if I asked 32767
  345. questions at once ;)  I'm having trouble with action functions.  This
  346. worked fine in 68k but I can't get it to run without a crash with the
  347. PowerPC:
  348.  
  349.     TrackControl(hControl, localMouse, (void *) ScrollActionProc);
  350.  
  351. /*
  352. the prototype for ScrollActionProc is:
  353. pascal void ScrollActionProc(ControlHandle hControl, short partCode);
  354. */
  355.  
  356. Tracing throught my code with a debugger shows that ScrollActionProc() is
  357. never run instead I get an Illegal Instruction message (apparently this
  358. (void *) ScrollActionProc is going of into the ozone...).
  359.  
  360. I had insert the (void *) to get it to compile; it wouldn't compile any
  361. other way.  Before the switch from 68k too PowerPC the above line read:
  362.  
  363.     TrackControl(hControl, localMouse, ScrollActionProc);
  364.  
  365. I've never had problems with it on the 68k.
  366.  
  367. Interestingly enough although I've had to typecast other function pointers
  368. as void* I haven't seen errors in any others.  For example, these seem to
  369. work fine:
  370.  
  371.     SetGrowZone((void *) MyGrowZone);
  372.     DeviceLoop(pWind->visRgn, (void *) GrayFrameDrawingProc, (long)
  373. &hFrameData, 0);
  374.  
  375. I've also been having problems with this:
  376.  
  377.     ForEachIconDo(hIcon, svAllAvailableData,  (void *) SaveCustomIcon, 0);
  378.  
  379. But I can't claim it was working before as I'm writting it for the first
  380. time on the PowerPC.
  381.  
  382. I suspect I'm Ignorant of some aspect of passing pointers to functions. 
  383. Any tips would be appreciated.
  384.  
  385. jrs     http://www.az.com:/~jrs
  386. --
  387. The other day I saw a bumper sticker which read "Honk if you passed 
  388. p-chem."  I honked and the driver flipped me off.  I guess he didn't pass
  389.  
  390. +++++++++++++++++++++++++++
  391.  
  392. >From dazuma@cco.caltech.edu (Daniel Azuma)
  393. Date: Mon, 04 Sep 1995 17:40:22 -0700
  394. Organization: California Institute of Technology, Pasadena
  395.  
  396. jrs@az.com (Jonathan R. Seagrave) wrote:
  397.  
  398. > Hi, I've been having some trouble porting 68k code to PowerPC code.  I
  399. > thought maybe I could get a pointer or two.  First, (I'll focus on a
  400. > specific problem -- I doubt I'd get much response if I asked 32767
  401. > questions at once ;)  I'm having trouble with action functions.  This
  402. > worked fine in 68k but I can't get it to run without a crash with the
  403. > PowerPC:
  404. >     TrackControl(hControl, localMouse, (void *) ScrollActionProc);
  405. > /*
  406. > the prototype for ScrollActionProc is:
  407. > pascal void ScrollActionProc(ControlHandle hControl, short partCode);
  408. > */
  409. > Tracing throught my code with a debugger shows that ScrollActionProc() is
  410. > never run instead I get an Illegal Instruction message (apparently this
  411. > (void *) ScrollActionProc is going of into the ozone...).
  412. > I had insert the (void *) to get it to compile; it wouldn't compile any
  413. > other way.  Before the switch from 68k too PowerPC the above line read:
  414. >     TrackControl(hControl, localMouse, ScrollActionProc);
  415. > I've never had problems with it on the 68k.
  416.  
  417. Okay, Jonathan, this is the trick when porting to PowerPC: you have to
  418. deal with mode switching.
  419.  
  420. Parts of the toolbox are fat (both 68K and PPC) but parts are still
  421. 68K-only. This 68K-only code cannot call your PPC-native action function
  422. directly; it gets confused and tries to interpret the PPC instructions as
  423. 68K instructions, which results in illegal instruction errors.
  424.  
  425. To deal with this, you need to specify action procedures as Universal
  426. ProcPtrs (UPPs). The UPP includes the address of the function, plus
  427. information on how to make the mode-switch from 68K to PPC. This is also
  428. the reason the code won't compile unless you typecast to (void *):
  429. TrackControl() is not expecting a function pointer, but a UPP.
  430.  
  431. To do this, you use a macro to create a UPP out of the address of your
  432. action procedure. For the TrackControl action procedure, the macro is
  433. called NewControlActionProc(), and it returns a UPP of type
  434. ControlActionUPP. This is what needs to be passed to TrackControl. Once
  435. you're done, you use the DisposeRoutineDescriptor() call to release the
  436. UPP.
  437.  
  438. So your code would look like this:
  439.  
  440.     ControlActionUPP myScrollActionUPP;
  441.  
  442.     myScrollActionUPP = NewControlActionProc(ScrollActionProc);
  443.     TrackControl(hControl, localMouse, myScrollActionUPP);
  444.  
  445.     // ...When done...
  446.     DisposeRoutineDescriptor (myScrollActionUPP);
  447.  
  448. You can look at the corresponding header files in the Universal Headers to
  449. see what the names of the UPP-creating macros are. There's a different
  450. macro for each kind of callback. NewControlActionProc() is defined in
  451. "Controls.h". A modal dialog filter proc UPP is created by the
  452. NewModalFilterProc() macro, defined in "Dialogs.h".
  453.  
  454. The above code will also work under 68K. When compiling PPC-native, the
  455. macros create the UPPs that are needed. When compiling 68K-native, they
  456. merely perform the necessary typecasts to make the code compile.
  457. Therefore, it is a good idea to use this technique from now on, in any mac
  458. code that you write.
  459.  
  460. In general, UPPs need to be used any time where it is possible that 68K
  461. code will call PPC code, or PPC code will call 68K code. For instance, you
  462. will need to use them if part of your program is compiled 68K and part is
  463. PPC. The details on this more advanced usage are discussed in "IM: PowerPC
  464. System Software". Some info can also be gleaned by studying the header
  465. file "MixedMode.h".
  466.  
  467. > The other day I saw a bumper sticker which read "Honk if you passed 
  468. > p-chem."  I honked and the driver flipped me off.  I guess he didn't pass
  469.  
  470. ROTFL! Heh, maybe I should get a bumper sticker saying "Honk if you passed
  471. thermal physics"...
  472.  
  473. Dan
  474.  
  475.                                                                 +-+
  476. ================================================================| |=======
  477.  \ _____ Daniel Azuma _____ \ "See what love the Father has  +--+ +--+  /
  478.   \ <dazuma@cco.caltech.edu> \  given us, that we should be  +--+ +--+ /
  479.    \    Caltech CS Student    \  called children of God..."     | |   /
  480.     \  Mac Programming Artist  \            ---1 John 3:1       | |  /
  481.     ============================================================| |===
  482.                                                                 | |
  483.                                                                 +-+
  484.  
  485. +++++++++++++++++++++++++++
  486.  
  487. >From tulip@tiac.net (Ed Anson)
  488. Date: Mon, 04 Sep 1995 22:59:53 -0400
  489. Organization: Tulip Software
  490.  
  491. In article <jrs-0309951203290001@pipe.az.com>, jrs@az.com (Jonathan R.
  492. Seagrave) wrote:
  493.  
  494. > questions at once ;)  I'm having trouble with action functions.  This
  495. > worked fine in 68k but I can't get it to run without a crash with the
  496. > PowerPC:
  497. >     TrackControl(hControl, localMouse, (void *) ScrollActionProc);
  498. > /*
  499. > the prototype for ScrollActionProc is:
  500. > pascal void ScrollActionProc(ControlHandle hControl, short partCode);
  501. > */
  502. > Tracing throught my code with a debugger shows that ScrollActionProc() is
  503. > never run instead I get an Illegal Instruction message (apparently this
  504. > (void *) ScrollActionProc is going of into the ozone...).
  505. > I had insert the (void *) to get it to compile; it wouldn't compile any
  506. > other way.  Before the switch from 68k too PowerPC the above line read:
  507.  
  508. The compiler was trying to tell you something. Too bad you lied to it and
  509. made it shut up :)
  510.  
  511. PPC code requires that you supply a UPP instead of a normal procedure
  512. pointer, when setting up call-backs such as these. The current "universal"
  513. headers provide the appropriate declarations and methods to create
  514. appropriate UPPs.
  515.  
  516. By casting away the type information, you fooled the compiler into
  517. accepting a procedure pointer where a UPP was required. The system's (68K)
  518. code tried to call your (PPC) code and things didn't work out as planned.
  519. The UPP is needed to enable the transition between emulated and native
  520. code.
  521.  
  522. If you don't know what this is all about, there is an entire volume of NIM
  523. devoted to PPC programming. It is essential reading.
  524.  
  525. - --------------------
  526. Ed Anson            MediaTree: multimedia outline editor & catalog
  527. Tulip Software
  528. Andover, MA 01810   For details, check out my WWW page:
  529. U.S.A.              <http://www.tiac.net/users/tulip/home.html>
  530.  
  531. +++++++++++++++++++++++++++
  532.  
  533. >From jordanz@altura.com (Jordan Zimmerman)
  534. Date: Tue, 05 Sep 1995 17:47:09 -0700
  535. Organization: Altura Software, Inc.
  536.  
  537. > Hi, I've been having some trouble porting 68k code to PowerPC code.  I
  538. > thought maybe I could get a pointer or two.  First, (I'll focus on a
  539. > specific problem -- I doubt I'd get much response if I asked 32767
  540. > questions at once ;)  I'm having trouble with action functions.  This
  541. > worked fine in 68k but I can't get it to run without a crash with the
  542. > PowerPC:
  543. >     TrackControl(hControl, localMouse, (void *) ScrollActionProc);
  544.  
  545. You really should read the Inside Mac volume on PowerPC System Software.
  546. Any callback that goes through the MacOS (as in TrackControl) must be
  547. passed as a RoutineDescriptor so that the MixedMode Manager can handle it.
  548. A full description is beyond what can be written here.
  549.  
  550. -- 
  551. Jordan Zimmerman, Altura Software
  552. home page: http://www.altura.com/jordanz/home.html
  553. Coming to you fast as lightning on a 9500/120!
  554.  
  555. ---------------------------
  556.  
  557. >From davidh@a.cs.okstate.edu (HILSABECK DAVID AL)
  558. Subject: Preferences Database project discussion
  559. Date: 2 Sep 1995 14:02:17 GMT
  560. Organization: Oklahoma State University, Stillwater OK
  561.  
  562. t seems as though every time I develop a Macintosh application, implementing 
  563. preferences seems to become more and more of a pain. There's to be a lot of 
  564. discussion on the topic, and Apple has published guidelines for implementing 
  565. preferences, but none of this answers the underlying question: How can I add 
  566. preferences to my application without the pain of managing a preferences 
  567. file?
  568.  
  569. All of the problems preferences pose could easily be overcome if there 
  570. were an automatic method of storing and retrieving data associated with an 
  571. application. Windows programmers have had a solution (a very limited 
  572. solution) to the preferences problem for some time. With .INI files, a 
  573. Windows programmer simply called one of four functions to store and 
  574. retrieve values in what amounted to preferences files. Now with Windows95 
  575. and Windows NT, Windows programmers have the Registration Database, which is 
  576. sort of like preferences on excessive steroids. Even the NeXT operating 
  577. system had a database for storing preferences, even if it did become corrupt 
  578. from time to time.
  579.  
  580. The Mac OS has gone without long enough. The time has come to implement the
  581. Macintosh Preferences Database. This is my proposal:
  582.  
  583. Implement a Preferences Database System that is composed of four parts. The 
  584. first part is a shared library (and an equivalent ASLM or 68KCFM library) 
  585. that implements the Preferences Manager. This provides an API for an 
  586. application to store and retrieve preferences in the Preferences Database. 
  587. The second part is the collection of Preferences Database files themselves. 
  588. These files reside in the Preferences folder and are completely controlled 
  589. by the Preferences Manager. The third part is the Preferences Utility. The 
  590. Preferences Utility allows end-user to do some simple management of the
  591. contents of the Preferences Database, as well as repair the Preferences
  592. Database should the need arise. The fourth part is the Developer Preferences
  593. Utility. This utility allows a developer to view and manipulate the contents 
  594. of the database for debugging purposes. The two utilities may be packaged as
  595. a single utility, with a hidden switch toggling the developer functionality.
  596.  
  597. The overall structure of the database would be heirarchial. The 
  598. root would contain a list of application signatures. Under its signature,
  599. an application can store a heirarchy of any data necessary to implement its 
  600. preferences. The key to retrieve any data item from the database would be a
  601. parent level ID (a long) and the name of the data item (an OSType). The root
  602. level would have a predefined ID. There would be excessively practical 
  603. limits imposed on the size (and content) of data stored in the database.
  604.  
  605. The Preferences Database would consist of a index/sequence set stored in one
  606. main database file, along with extra files to store objects that would pose 
  607. storage problems for the main database file. The structure of the main 
  608. database file would be a b+tree with a b*tree index set. The sequence
  609. set would be based on an adaptive inverted list structure. Both index and 
  610. sequence set would rely on an underlying block structure. All algorithms used
  611. to manipulate the index set, sequence set, and block structure would be 
  612. fault tolerant.
  613.  
  614. The Preferences Manager would simply be a set of functions stored in a shared
  615. library. There will be no system extensions, control panels, or background
  616. applications. The API presented by the Preferences Manager would allow an 
  617. application to open the database, store and retrieve data within the database
  618. heirarchy, get information about the contents of the database, and otherwise
  619. manipulate the database. The functionality would be somewhat congruent to the
  620. functionality of the File Manager. When Copland is released, the Preferences 
  621. Manager would need to modified to allow controlled, shared, re-entrant, and 
  622. pre-emptive access to the database (which can't be done now without at least
  623. turning on file sharing) through a [hopefully] new File Manager API. I have
  624. designed an actual Preferences Manager API, but I don't want to get that 
  625. detailed quite yet (but I will later).
  626.  
  627. The functionality of the Preferences Utilities is still fuzzy. What I would
  628. like to see is a architecture that would allow plug-ins to decode the 
  629. contents of custom data items for developers. Or maybe something based on
  630. ResEdit TMPLs. Like I said, this is still fuzzy. I can say that the 
  631. Registration Manager/Utility in Windows NT is completely overboard. I want 
  632. something that won't scare (or harm) end-users.
  633.  
  634. Finally, the Preferences Database System would be freely distributable. As
  635. more applications used it, its value to both users and developers would
  636. increase. I've even kicked around the idea of making it portable, since
  637. so much cross-platform development is being done these days (trust me, I 
  638. KNOW!). 
  639.  
  640. This should be enough to get the ball rolling. If you understand my 
  641. preferences frustration and find the Preferences Database idea interesting, 
  642. I would like to hear from you. I need know if such a project would be useful 
  643. to other developers. I would hate to spend all the time this project would 
  644. take (which would be my own free time) only to find that noone's interested 
  645. in using it.
  646.  
  647. Please post your comments, questions, opinions, observations, concerns, and 
  648. constructive flames. 
  649.  
  650. Thanks,
  651. David Hilsabeck
  652. davidh@a.cs.okstate.edu
  653. david@tms-ok.mhs.compuserve.com
  654.  
  655.  
  656.  
  657. +++++++++++++++++++++++++++
  658.  
  659. >From andrewwelc@aol.com (AndrewWelc)
  660. Date: 2 Sep 1995 21:10:45 -0400
  661. Organization: America Online, Inc. (1-800-827-6364)
  662.  
  663. > This should be enough to get the ball rolling. If you understand my
  664. > preferences frustration and find the Preferences Database idea
  665. > interesting, I would like to hear from you. I need know if such a
  666. > project would be useful to other developers. I would hate to spend all
  667. > the time this project would take (which would be my own free time) only
  668. > to find that noone's interested in using it.
  669.  
  670. Sounds good to me -- let me know if you need any help.
  671.  
  672. Regards,
  673.  
  674. Andrew Welch
  675. Thaumaturgist
  676. Ambrosia Software, Inc.
  677.  
  678. ..........
  679.  
  680. For the latest versions of our software, technical support, and Ambrosia
  681. news, stop by and visit the Ambrosia Software, Inc. support forums:
  682.  
  683. America Online ---> Keyword: Ambrosia
  684.     CompuServe ---> GO word: Ambrosia
  685.         eWorld --> Shortcut: Ambrosia
  686.  
  687. +++++++++++++++++++++++++++
  688.  
  689. >From 3gl21@qlink.queensu.ca (Gregory Lo)
  690. Date: Sun, 03 Sep 1995 00:34:48 -0400
  691. Organization: Queen's University
  692.  
  693. In article <429o59$iuh@bubba.ucc.okstate.edu>, davidh@a.cs.okstate.edu
  694. (HILSABECK DAVID AL) wrote:
  695. > All of the problems preferences pose could easily be overcome if there 
  696. > were an automatic method of storing and retrieving data associated with an 
  697. > application. Windows programmers have had a solution (a very limited 
  698. > solution) to the preferences problem for some time. With .INI files, a 
  699. > Windows programmer simply called one of four functions to store and 
  700. > retrieve values in what amounted to preferences files. Now with Windows95 
  701. > and Windows NT, Windows programmers have the Registration Database, which is 
  702. > sort of like preferences on excessive steroids. Even the NeXT operating 
  703. > system had a database for storing preferences, even if it did become corrupt 
  704. > from time to time.
  705.  
  706. How about extending Internet Config to handle preferences other than those
  707. associated with Internet applications?
  708. At this point it really doesn't matter how the proposed Preferences
  709. Manager works internally;  it could be ASLM, Component, CFM, staticly
  710. linked libs, etc.
  711. We can get started by determining an interface, which should be
  712. independant of how the manager is implemented.  Internet Config should
  713. definitely be examined for inspiration.
  714.  
  715. GLo
  716.  
  717. - ---------------------------------------------------------
  718. Gregory Lo  GLo ?:^(>      <mailto:3gl21@qlink.queensu.ca>
  719.  
  720. +++++++++++++++++++++++++++
  721.  
  722. >From peter@stairways.com.au (Peter N Lewis)
  723. Date: Sun, 03 Sep 1995 23:37:18 +0800
  724. Organization: Stairways Software
  725.  
  726. In article <3gl21-0309950034480001@slip120.qlink.queensu.ca>,
  727. 3gl21@qlink.queensu.ca (Gregory Lo) wrote:
  728.  
  729. >How about extending Internet Config to handle preferences other than those
  730. >associated with Internet applications?
  731.  
  732. IC already supports anon-internet preferences.  You can store any
  733. preferences you want in there, there is even a defined way to avoid
  734. preference keys from clashing with other developers.
  735.  
  736. However, IC's actual implementation for storing the prefs is not really
  737. stressed for handling a very large number of preferences, since it just
  738. uses the Resource Manager ("The Resource Manager is not a database" "yes
  739. it is!" "well, not a very good one" "too true!" :-).  However, IC's API
  740. and Component Manager implementation is perfectly well suited to be a
  741. general purpose preference manager.  Now, if someone wanted to take over
  742. and stick a more robust database on the back end of IC... :-)
  743.    Peter.
  744. -- 
  745. "there is no significant correlation to violence on TV and agression in 
  746. daily life" - NHR Broadcasting Culture Research Institute in Tokyo.
  747.  
  748. ---------------------------
  749.  
  750. >From "Andrew C. Plotkin" <erkyrath+@CMU.EDU>
  751. Subject: QuickTime volumes
  752. Date: Fri,  1 Sep 1995 13:46:04 -0400
  753. Organization: Carnegie Mellon, Pittsburgh, PA
  754.  
  755. (This is one of those "it works, but is it a good idea?" questions.)
  756.  
  757. I have a MIDI file. I convert it to a QT movie using SimpleText 1.3 (I
  758. have QuickTime 2.0 and the QT musical instruments installed, of
  759. course.)
  760.  
  761. The result is a QT movie with one track, an audio track, and it does
  762. indeed play music. But it's awfully quiet.
  763.  
  764. So I'd like to amplify it. But both GetMovieVolume (on the movie) and
  765. GetTrackVolume (on the track) return 1.0. That's the value 255, so
  766. actually I guess they're returning 0.998 or something.
  767.  
  768. The documentation on SetMovieVolume and SetTrackVolume say that they
  769. take fixed-point values from -1.0 to 1.0. Now if I do 
  770.     SetMovieVolume(mov, GetMovieVolume(mov) * 2); 
  771. it does get louder.  In fact I can crank the multiplier up to about 5;
  772. beyond that it doesn't get any louder, although it still doesn't seem
  773. to produce any errors. But technically I'm doing something undefined
  774. by the documentation.
  775.  
  776. To confuse matters more, I have a version of MoviePlayer (2.0b2) which
  777. allows me to set the track volume from 0 % to 200 %. I assume that
  778. setting 200% is the equivalent of 
  779.     SetTrackVolume(trak, GetTrackVolume(trak) * 2);
  780. So is this sort of legitimized? Is there some documentation on how
  781. high I can crank this thing? Am I running the risk that in some future
  782. (or past) version of QuickTime, it won't get any louder at all?
  783.  
  784. --Z
  785.  
  786. "And Aholibamah bare Jeush, and Jaalam, and Korah: these were the borogoves..."
  787.  
  788. +++++++++++++++++++++++++++
  789.  
  790. >From ldo@waikato.ac.nz (Lawrence D'Oliveiro)
  791. Date: Mon, 04 Sep 1995 16:52:08 +1200
  792. Organization: University of Waikato
  793.  
  794. In article <AkFoPQW00WB3EGqmN_@andrew.cmu.edu>, "Andrew C. Plotkin"
  795. <erkyrath+@CMU.EDU> wrote:
  796.  
  797. >So I'd like to amplify it. But both GetMovieVolume (on the movie) and
  798. >GetTrackVolume (on the track) return 1.0. That's the value 255, so
  799. >actually I guess they're returning 0.998 or something.
  800.  
  801. Actually, I think there may be a slight inconsistency here. I believe the
  802. documentation indicates that the volume is an 8.8 fixed number, so 100%
  803. should really be 256, not 255. But, as you've noticed, the default volume
  804. setting for new movies is 255.
  805.  
  806. On the other hand, it's been like this since QuickTime 1.0, so they
  807. probably figured it's too late to change now...
  808.  
  809. >The documentation on SetMovieVolume and SetTrackVolume say that they
  810. >take fixed-point values from -1.0 to 1.0. Now if I do 
  811. >    SetMovieVolume(mov, GetMovieVolume(mov) * 2); 
  812. >it does get louder.  In fact I can crank the multiplier up to about 5;
  813. >beyond that it doesn't get any louder, although it still doesn't seem
  814. >to produce any errors. But technically I'm doing something undefined
  815. >by the documentation.
  816.  
  817. In the release notes for QuickTime 1.6, it was made clear that it did now
  818. support volumes greater than 100%, but you needed Sound Manager 3.0 (or
  819. later) in order for this to work.
  820.  
  821. If you hold down the shift key and click on the volume slider in a movie,
  822. you'll see that the volume range goes up to 300%.
  823.  
  824. >To confuse matters more, I have a version of MoviePlayer (2.0b2) which
  825. >allows me to set the track volume from 0 % to 200 %. I assume that
  826. >setting 200% is the equivalent of 
  827. >    SetTrackVolume(trak, GetTrackVolume(trak) * 2);
  828. >So is this sort of legitimized? Is there some documentation on how
  829. >high I can crank this thing? Am I running the risk that in some future
  830. >(or past) version of QuickTime, it won't get any louder at all?
  831.  
  832. I'm sure Sound Manager 3.x can apply much larger amplification factors
  833. than this--it's just multiplying numbers, after all. There are really only
  834. two potential problems:
  835.  
  836. 1) If you're trying to amplify a sound that's too soft, it is liable to
  837. get noisy. (This will only apply to sampled-sound tracks, not music
  838. tracks.)
  839. 2) If you amplify a sound (or mixture of sounds) that _isn't_ too soft, it
  840. will start to clip and sound horribly distorted.
  841.  
  842. Apart from watching out for these two things, what you're trying to do IS
  843. in fact fully supported, and should continue to remain so.
  844.  
  845. PS: if you want to make the volume change permanent, you can use
  846. SetMoviePreferredVolume.
  847.  
  848. +++++++++++++++++++++++++++
  849.  
  850. >From reinder@neuretp.biol.ruu.nl (Reinder Verlinde)
  851. Date: Mon, 04 Sep 1995 11:53:57 +0200
  852. Organization: Rijksuniversiteit Utrecht
  853.  
  854. In article <AkFoPQW00WB3EGqmN_@andrew.cmu.edu>, "Andrew C. Plotkin"
  855. <erkyrath+@CMU.EDU> wrote:
  856.  
  857. > The documentation on SetMovieVolume and SetTrackVolume say that they
  858. > take fixed-point values from -1.0 to 1.0. Now if I do 
  859. >     SetMovieVolume(mov, GetMovieVolume(mov) * 2); 
  860. > it does get louder.  In fact I can crank the multiplier up to about 5;
  861. > beyond that it doesn't get any louder, although it still doesn't seem
  862. > to produce any errors. But technically I'm doing something undefined
  863. > by the documentation.
  864. >
  865. It is defined in tech notes released with some upgrade. I think that
  866. Sound Manager 3.0 allows 'overdriving' the sound volume, so you should
  867. try to find the release notes for Sound Manager 3.0. I believe the new
  868. maximum sound volume is 0x1FF, but am not sure about it. There also
  869. is a new call which allows you to set volumes for left and right
  870. channels separately (to get cool pseudo-stereo sound movement)
  871.  
  872. Reinder Verlinde
  873.  
  874. Unix: the original thing wasn't designed at all.
  875.       Then, when it got designed, it got designed by a committee.
  876.       Worse yet, it got designed by an army of committees.
  877.  
  878. ---------------------------
  879.  
  880. >From klopfer@macc.wisc.edu (Eric Klopfer)
  881. Subject: Random Numbers
  882. Date: Fri, 01 Sep 1995 22:18:08 -0500
  883. Organization: U.W. Madison
  884.  
  885. I need to generate random numbers at a fairly fine scale on the range
  886. 0->1.  I am writing my program in Symantec C++ on a PPC.  I have been
  887. using the built in rand() statement, but it only generates 32768 numbers
  888. and this is not a fine enough scale for my use.  I know that the toolbox
  889. has a routine to generate twice this many, but this is not a substantial
  890. enough increase.  I need 10x or 100x better resolution.
  891.  
  892. Can anyone give me a good (pseudo) random-number generator that won't slow
  893. things down much (I use the random number generator a lot), that would
  894. allow me this increase in resolution?
  895.  
  896. Thanks.
  897. >From klopfer@macc.wisc.edu (Eric Klopfer)
  898. Subject: Random Numbers
  899. Date: Fri, 01 Sep 1995 22:18:08 -0500
  900. Organization: U.W. Madison
  901.  
  902. I need to generate random numbers at a fairly fine scale on the range
  903. 0->1.  I am writing my program in Symantec C++ on a PPC.  I have been
  904. using the built in rand() statement, but it only generates 32768 numbers
  905. and this is not a fine enough scale for my use.  I know that the toolbox
  906. has a routine to generate twice this many, but this is not a substantial
  907. enough increase.  I need 10x or 100x better resolution.
  908.  
  909. Can anyone give me a good (pseudo) random-number generator that won't slow
  910. things down much (I use the random number generator a lot), that would
  911. allow me this increase in resolution?
  912.  
  913. Thanks.
  914.  
  915. +++++++++++++++++++++++++++
  916.  
  917. >From Keith Wiley <keithw@wam.umd.edu>
  918. Date: Sat, 2 Sep 1995 00:59:49 -0400
  919. Organization: University of Maryland College Park
  920.  
  921. On Fri, 1 Sep 1995, Eric Klopfer wrote:
  922.  
  923. > I need to generate random numbers at a fairly fine scale on the range
  924. > 0->1.  I am writing my program in Symantec C++ on a PPC.  I have been
  925. > using the built in rand() statement, but it only generates 32768 numbers
  926. > and this is not a fine enough scale for my use.  I know that the toolbox
  927. > has a routine to generate twice this many, but this is not a substantial
  928. > enough increase.  I need 10x or 100x better resolution.
  929. > Can anyone give me a good (pseudo) random-number generator that won't slow
  930. > things down much (I use the random number generator a lot), that would
  931. > allow me this increase in resolution?
  932.  
  933. Assuming you've got memory allocation for really large numbers all 
  934. figured out, why don't you generate two numbers and multiply them.  This 
  935. will give you any number from 0 - 1073741824.  I'm fairly certain various 
  936. numbers in this sequence would be more likely than others, however, as 
  937. you approach the more centrally-based numbers, but if that ok, this is a 
  938. wonderful solution.  Two calls to rand() won't take up too much more 
  939. computation.
  940.  
  941. . . .. ... ..... ........ ............. .....................
  942. .. ... ..... ....... ........... ............. .................
  943. . .. .... ........ ................ ................................
  944. Keith Wiley, Electrogenetic Engineer             *
  945. University of Maryland at College Park            *   * *     *   *      *
  946. email:  keithw@wam.umd.edu                      ***    **   * *    **     *
  947. world wide web:  http://www.wam.umd.edu/~keithw        *     **   **    ***
  948.  
  949.  
  950. +++++++++++++++++++++++++++
  951.  
  952. >From dmpalmer@clark.net (David M. Palmer)
  953. Date: 2 Sep 1995 09:54:44 -0400
  954. Organization: Clark Internet Services, Inc., Ellicott City, MD USA
  955.  
  956. Keith Wiley <keithw@wam.umd.edu> writes:
  957.  
  958. >On Fri, 1 Sep 1995, Eric Klopfer wrote:
  959.  
  960. >> I need to generate random numbers at a fairly fine scale on the range
  961. >> 0->1.  I am writing my program in Symantec C++ on a PPC.  I have been
  962.  
  963. >Assuming you've got memory allocation for really large numbers all 
  964. >figured out, why don't you generate two numbers and multiply them.  This 
  965. >will give you any number from 0 - 1073741824.  I'm fairly certain various 
  966.  
  967. Bad idea.  In general, you don't get random numbers by doing random things.
  968.  
  969. Even built-in random number geenerators are often unsuitable for serious
  970. work, especially those that use the linear-congruential method (where
  971. Newrand = (oldrand * A + B) % C ).
  972.  
  973. Look in 'Numerical Recipies in C' by Teukolsky (sp?) et al. for
  974. good random number generators.
  975.  
  976. -- 
  977.                         David Palmer
  978.                         palmer@alumni.caltech.edu
  979.                         dmpalmer@clark.net
  980.  
  981. +++++++++++++++++++++++++++
  982.  
  983. >From Jonathan Salz <jsalZ@grex.cyberspace.org>
  984. Date: 3 Sep 1995 02:50:03 GMT
  985. Organization: Grex
  986.  
  987. In article <klopfer-0109952218080001@f181-218.net.wisc.edu> Eric Klopfer,
  988. klopfer@macc.wisc.edu writes:
  989. >I need to generate random numbers at a fairly fine scale on the range
  990. >0->1.  I am writing my program in Symantec C++ on a PPC.  I have been
  991. >using the built in rand() statement, but it only generates 32768 numbers
  992. >and this is not a fine enough scale for my use.  I know that the toolbox
  993. >has a routine to generate twice this many, but this is not a substantial
  994. >enough increase.  I need 10x or 100x better resolution.
  995. >
  996. >Can anyone give me a good (pseudo) random-number generator that won't
  997. slow
  998. >things down much (I use the random number generator a lot), that would
  999. >allow me this increase in resolution?
  1000.  
  1001. The other respondees to this article are right--rand() is not a terrific
  1002. random
  1003. number generator. Even if you're satisfied with rand(), multiplying the
  1004. results
  1005. of two calls to rand() won't give you good random numbers, because
  1006. numbers with
  1007. lots of factors will pop up often and prime number won't pop up at all.
  1008. You
  1009. can, however, get random numbers from 0 to 2^30 if you just bitshift the
  1010. result
  1011. of one call to rand() by 15 to the left, and add the result of another
  1012. call to
  1013. rand():
  1014.  
  1015. unsigned long rand30() { return (rand() << 15) + rand(); }
  1016.  
  1017. - Jonathan Salz
  1018. - jsalz@grex.cyberspace.org
  1019.  
  1020. +++++++++++++++++++++++++++
  1021.  
  1022. >From preilly@isoquantic.com (Patrick L. Reilly)
  1023. Date: Sat, 02 Sep 1995 14:51:17 -0700
  1024. Organization: IsoQuantic Technologies, LLC
  1025.  
  1026. In article <klopfer-0109952218080001@f181-218.net.wisc.edu>,
  1027. klopfer@macc.wisc.edu (Eric Klopfer) wrote:
  1028.  
  1029. | I need to generate random numbers at a fairly fine scale on the range
  1030. | 0->1.  I am writing my program in Symantec C++ on a PPC.  I have been
  1031. | using the built in rand() statement, but it only generates 32768 numbers
  1032. | and this is not a fine enough scale for my use.  I know that the toolbox
  1033. | has a routine to generate twice this many, but this is not a substantial
  1034. | enough increase.  I need 10x or 100x better resolution.
  1035. | Can anyone give me a good (pseudo) random-number generator that won't slow
  1036. | things down much (I use the random number generator a lot), that would
  1037. | allow me this increase in resolution?
  1038. | Thanks.
  1039.  
  1040.  
  1041. Try this on for size:
  1042.  
  1043.  
  1044. #include <stdio.h>
  1045. #include <math.h>
  1046. #include <console.h>
  1047.  
  1048. /*
  1049.    Prime modulus multiplicative linear congruential generator
  1050. */
  1051. #define     MODULUS  2147483647
  1052. #define     MULT1 24112
  1053. #define     MULT2 26143
  1054.  
  1055. static   long  zrng[] = {0, 
  1056. 1973272912,     281629770,      20006270,       1280689831,    
  1057. 2096730329,     1933576050,
  1058. 913566091,      246780520,      1363774876,     604901985,     
  1059. 1511192140,     1259851944,
  1060. 824064364,      150493284,      242708531,      75253171,      
  1061. 1964472944,     1202299975,
  1062. 233217322,      1911216000,     726370533,      403498145,     
  1063. 993232223,      1103205531,
  1064. 762430696,      1922803170,     1385516923,     76271663,      
  1065. 413682397,      726466604,
  1066. 336157058,      1432650381,     1120463904,     595778810,     
  1067. 877722890,      1046574445,
  1068. 68911991,       2088367019,     748545416,      622401386,     
  1069. 2122378830,     640690903,
  1070. 1774806513,     2132545692,     2079249579,     78130110,      
  1071. 852776735,      1187867272,
  1072. 1351423507,     1645973084,     1997049139,     922510944,     
  1073. 2045512870,     898585771,
  1074. 243649545,      1004818771,     773686062,      403188473,     
  1075. 372279877,      1901633463,
  1076. 498067494,      2087759558,     493157915,      597104727,     
  1077. 1530940798,     1814496276,
  1078. 536444882,      1663153658,     855503735,      67784357,      
  1079. 1432404475,     619691088,
  1080. 119025595,      880802310,      176192644,      1116780070,    
  1081. 277854671,      1366580350,
  1082. 1142483975,     2026948561,     1053920743,     786262391,     
  1083. 1792203830,     1494667770,
  1084. 1923011392,     1433700034,     1244184613,     1147297105,    
  1085. 539712780,      1545929719,
  1086. 190641742,      1645390429,     264907697,      620389253,     
  1087. 1502074852,     927711160,
  1088. 364849192,      2049576050,     638580085,      547070247};
  1089.  
  1090. double   random(stream)
  1091. int   stream;
  1092. {
  1093.    long  zi, lowprd, hi31;
  1094.    
  1095.    zi = zrng[stream];
  1096.    lowprd = (zi & 65535) * MULT1;
  1097.    hi31 = (zi >> 16) * MULT1 + (lowprd >> 16);
  1098.    zi = ((lowprd & 65535) - MODULUS) +
  1099.          ((hi31 & 32767) << 16) + (hi31 >> 15);
  1100.    if(zi < 0)  zi += MODULUS;
  1101.    lowprd = (zi & 65535) * MULT2;
  1102.    hi31 = (zi >> 16) * MULT2 + (lowprd >> 16);
  1103.    zi = ((lowprd & 65535) - MODULUS) +
  1104.          ((hi31 & 32767) << 16) + (hi31 >> 15);
  1105.    if(zi < 0)  zi += MODULUS;
  1106.    zrng[stream] = zi;
  1107.    return ((zi >> 7 | 1) + 1)/16777216.0;
  1108. }
  1109.  
  1110. --
  1111. IsoQuantic Technologies   | 1857 W. Calle Del Norte, Chandler, AZ 85224 
  1112. Patrick L. Reilly,Gen.Mgr.| Voice: +1.602.917.9543 Fax: +1.602.917.9493
  1113. preilly@isoquantic.com    |   Network Architecture, Design & Analysis
  1114.  
  1115. +++++++++++++++++++++++++++
  1116.  
  1117. >From Mark Williams <Mark@streetly.demon.co.uk>
  1118. Date: Sun, 03 Sep 95 15:46:20 GMT
  1119. Organization: Streetly Software
  1120.  
  1121.  
  1122. In article <42b54r$nmk@oak.oakland.edu>, Jonathan Salz writes:
  1123.  
  1124. > In article <klopfer-0109952218080001@f181-218.net.wisc.edu> Eric Klopfer,
  1125. > klopfer@macc.wisc.edu writes:
  1126. > >I need to generate random numbers at a fairly fine scale on the range
  1127. > >0->1.  I am writing my program in Symantec C++ on a PPC.  I have been
  1128. > >using the built in rand() statement, but it only generates 32768 numbers
  1129. > >and this is not a fine enough scale for my use.  I know that the toolbox
  1130. > >has a routine to generate twice this many, but this is not a substantial
  1131. > >enough increase.  I need 10x or 100x better resolution.
  1132. > >
  1133. > >Can anyone give me a good (pseudo) random-number generator that won't
  1134. > slow
  1135. > >things down much (I use the random number generator a lot), that would
  1136. > >allow me this increase in resolution?
  1137. > The other respondees to this article are right--rand() is not a terrific
  1138. > random
  1139. > number generator. Even if you're satisfied with rand(), multiplying the
  1140. > results
  1141. > of two calls to rand() won't give you good random numbers, because
  1142. > numbers with
  1143. > lots of factors will pop up often and prime number won't pop up at all.
  1144. > You
  1145. > can, however, get random numbers from 0 to 2^30 if you just bitshift the
  1146. > result
  1147. > of one call to rand() by 15 to the left, and add the result of another
  1148. > call to
  1149. > rand():
  1150. > unsigned long rand30() { return (rand() << 15) + rand(); }
  1151.  
  1152. I doubt this will work either. I dont know the algorithm rand uses, but I suspect that it will have 
  1153. a fairly short cycle length (certainly much less than 2^30), and since rand30 will halve this cycle 
  1154. length, you will get a fairly sparse set of results.
  1155.  
  1156. - --------------------------------------
  1157. Mark Williams<Mark@streetly.demon.co.uk>
  1158.  
  1159. +++++++++++++++++++++++++++
  1160.  
  1161. >From klopfer@macc.wisc.edu (Eric Klopfer)
  1162. Date: Mon, 04 Sep 1995 14:42:30 -0500
  1163. Organization: U.W. Madison
  1164.  
  1165. I got the following response about one of the techniques posted.  I
  1166. thought others might be interested as well.
  1167.  
  1168. Please refer to:
  1169.  
  1170. Simulation Modeling & Analysis, Law/Kelton, McGraw-Hill, 1990, ISBN
  1171. 0-07-036698-5
  1172.  
  1173. for more information about the random number generator I (Patrick L.
  1174. Reilly) posted. This book
  1175. should be read by anyone planning a simulation activity using random number
  1176. generators. Unfortunately, many folks think that just calling the system
  1177. rand() function is sufficiently random. Pity the client who relies upon the
  1178. results of such a simulation.
  1179.  
  1180. Essentially, the number is the length of the random number cycle and the
  1181. largest possible number that can be represented on a 32-bit computer. The
  1182. list of numbers *are* seeds for the 100 random number streams that are
  1183. possible with this code. This way you can have different random numbers
  1184. generators for different processes in the same model. The streams are
  1185. around 100,000 numbers apart and specially selected to reduce stream
  1186. overlap and the few badly correlated cycles in this type of random number
  1187. generator.
  1188.  
  1189. ---------------------------
  1190.  
  1191. >From troika@panix.com (Mark Coniglio)
  1192. Subject: [Q] Gestalt to determine number of serial ports?
  1193. Date: Mon, 28 Aug 1995 18:41:48 -0500
  1194. Organization: Troika Ranch
  1195.  
  1196. I am updating an app that uses the serial driver on the powerbooks. I
  1197. would like to be able to determine if there are two serial ports (e.g.,
  1198. 140, 160, 180, etc.) or just one (e.g., 500 series). In the "Gestalt
  1199. Selectors List 2.9" which has appeared in this newsgroup, there is a
  1200. 'port' selector that seems that it would provide this information. It is
  1201. documented there as:
  1202.  
  1203.      gestaltPortAttr?           = 'port';
  1204.      gestaltHasInternalModem?   = 0?;
  1205.      gestaltHasExternalPrinter? = 1?;
  1206.      gestaltHasExternalModem?   = 2?;
  1207.  
  1208. In fact, this call does not always return a 1 in the third bit if there is
  1209. a printer port. Though undocumented, I verified that this 'port' selector
  1210. is used by the Chooser in my copy of system 7.5 on my desktop Mac by
  1211. setting an A-Trap Break in MacsBug.
  1212.  
  1213. Though a recognized Gestalt selector would be the ideal solution, any
  1214. other reliable (and machine independent) methods for determining the
  1215. number of ports would be useful.
  1216.  
  1217. Please email to troika@panix.com or post to this newsgroup.
  1218.  
  1219. Thanks a million
  1220. Mark Coniglio
  1221.  
  1222. -- 
  1223. mail: troika@panix.com
  1224. http: www.art.net/Studios/Performance/Dance/Troika_Ranch/TroikaHome.html
  1225.  
  1226. +++++++++++++++++++++++++++
  1227.  
  1228. >From Chrisoft@planete.net (Christophe ANDRES)
  1229. Date: Tue, 29 Aug 1995 22:47:17 +0200
  1230. Organization: Chrisoft
  1231.  
  1232. In article <troika-2808951841480001@troika.dialup.access.net>,
  1233. troika@panix.com (Mark Coniglio) wrote:
  1234.  
  1235. > Though a recognized Gestalt selector would be the ideal solution, any
  1236. > other reliable (and machine independent) methods for determining the
  1237. > number of ports would be useful.
  1238. > Please email to troika@panix.com or post to this newsgroup.
  1239.  
  1240. I don't know of a gestalt selector counting the serial ports, but using
  1241. the comm Toolbox, in one of my programs, I have to get them to show a
  1242. list. I think this could be of help.
  1243.  
  1244. P.S. : this is an taken directly from a MacApp programm.
  1245.  
  1246. {
  1247.    CRMRec      c;
  1248.    CRMRecPtr cPtr = &c;
  1249.    CRMSerialPtr serialPtr;
  1250.    comPortID theComPort;
  1251.  
  1252.    c.crmDeviceType = crmSerialDevice;  // to look only for serial ports
  1253.    c.crmDeviceID = 0;
  1254.    while (cPtr != nil)  // Browse through all entries
  1255.       {
  1256.          cPtr = CRMSearch(cPtr);
  1257.          if (cPtr)
  1258.             {
  1259.                serialPtr = (CRMSerialPtr)cPtr->crmAttributes;
  1260.                c.crmDeviceID = cPtr->crmDeviceID;
  1261.  
  1262.                theComPort.portName = CStr255(*(serialPtr->name));
  1263.                theComPort.portIcon = serialPtr->deviceIcon;
  1264.                this->InsertElementsBefore(fSize + 1, &theComPort, 1);
  1265.             }
  1266.       }
  1267. }
  1268.  
  1269. -- 
  1270. Chrisoft
  1271. >From troika@panix.com (Mark Coniglio)
  1272.  
  1273. +++++++++++++++++++++++++++
  1274.  
  1275. >From j-jahnke@uchicago.edu (Jerome Jahnke)
  1276. Date: Mon, 4 Sep 1995 17:14:53 GMT
  1277. Organization: BSD Academic Computing
  1278.  
  1279. In article <troika-2808951841480001@troika.dialup.access.net>,
  1280. troika@panix.com (Mark Coniglio) wrote:
  1281.  
  1282. > I am updating an app that uses the serial driver on the powerbooks. I
  1283. > would like to be able to determine if there are two serial ports (e.g.,
  1284. > 140, 160, 180, etc.) or just one (e.g., 500 series). In the "Gestalt
  1285. > Selectors List 2.9" which has appeared in this newsgroup, there is a
  1286. > 'port' selector that seems that it would provide this information. It is
  1287. > documented there as:
  1288. >      gestaltPortAttr?           = 'port';
  1289. >      gestaltHasInternalModem?   = 0?;
  1290. >      gestaltHasExternalPrinter? = 1?;
  1291. >      gestaltHasExternalModem?   = 2?;
  1292. >  
  1293. > In fact, this call does not always return a 1 in the third bit if there is
  1294. > a printer port. Though undocumented, I verified that this 'port' selector
  1295. > is used by the Chooser in my copy of system 7.5 on my desktop Mac by
  1296. > setting an A-Trap Break in MacsBug.
  1297.  
  1298. Use the comm toolbox. It has the CRMSerialRecords that are a list of all
  1299. serial connections your machine can make. You can then sort through them.
  1300. It makes your software much more portable. It also includes snazzy icon
  1301. families and real text descriptions of the names of the ports.
  1302.  
  1303. Jer,
  1304.  
  1305. -- 
  1306. Jerome Jahnke
  1307. BSD Academic Computing
  1308. j-jahnke@uchicago.edu
  1309.  
  1310. ---------------------------
  1311.  
  1312. End of C.S.M.P. Digest
  1313. **********************
  1314.